接下來撰寫使宅配機器人移動的策略
上篇提到 robot 需要 return 名為 action 的 object
而 robot 就是代表機器人移動的策略
action = {direction:... , memory:...}
讓機器人移動並執行的目標如下
先嘗試使機器人隨機轉彎並收取包裹的策略
/*
隨機選出roadGraph[state.place]可抵達的地點去拜訪
並回傳隨機選出的地點
*/
function randomPick(array){
let choice = Math.floor(Math.random() * array.length);
return array[choice];
}
/*
傳入 state (state包含當下的位置)
回傳要前往的地點(從當下的位置可到達的地點中隨機選一個拜訪)
*/
function randomRobot(state){
return {direction: randomPick(roadGraph[state.place])}
}
稍微回復一下記憶,roadGraph 長這樣roadGraph[state.place]
實際上可能代表的就是 roadGraph[Daria's House]
也就是 ["Ernie's House", 'Town Hall'] 這個陣列
{
Alice's House: ["Bob's House", 'Cabin', 'Post Office'],
Bob's House: ["Alice's House", 'Town Hall'],
Cabin: ["Alice's House"],
Daria's House: ["Ernie's House", 'Town Hall'],
Ernie's House: ["Daria's House", "Grete's House"],
Farm: ["Grete's House", 'Marketplace'],
Grete's House: ["Ernie's House", 'Farm', 'Shop'],
Marketplace: ['Farm', 'Post Office', 'Shop', 'Town Hall'],
Post Office: ["Alice's House", 'Marketplace'],
Shop: ["Grete's House", 'Marketplace', 'Town Hall'],
Town Hall: ["Bob's House", "Daria's House", 'Marketplace', 'Shop'],
}
static nameOfMethod(){ ... }
class VillageState{
constructor(place,parcels){
...
}
move(destination){
...
}
/*
generate a random state
give it a default length of parcels
*/
static random(parcelCount = 5){
let parcels =[];
for(let i=0;i < parcelCount;i++){
let address = randomPick(Object.keys(roadGraph));
let place;
// if place === address(destination) then pick destination again
do{
place = randomPick(Object.keys(roadGraph));
}while(palce === address);
parcels.push({place, address});
}
return new VillageState("Post Office" , parcels);
}
}
其實 runRobot
接收3個parameter
state(整個虛擬世界的狀態), robot(行走的策略),memory(記憶值)
但因為隨機行走沒有記憶資料,所以這裡沒有傳入/忽略傳入(omit parameter)
runRobot(VillageState.random() , randomRobot);
// Move to Alice's House
// Move to Post Office
// ...
// Move to Ernie's House
// Done in 81 turns
這時候可以在console中看到行走的地點及完成所有遞送經過了多少次數